﻿// 1004 最小路径覆盖.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <memory.h>

using  namespace std;
/*

http://oj.daimayuan.top/course/14/problem/800

给你一张有向无环图，你需要求出最少用多少条互不相交的路径可以覆盖图中所有顶点。

两条路径不相交是指两条路径不经过同一个点。

路径可以不包含边。

图用以下形式给出：

第一行输入两个整数 n,m
，表示图的顶点数和边数，顶点编号从 1到 n。

接下来 m 行，每行两个整数 x,y
，表示 x 和 y之间有一条边。

输出一个数为最少的路径条数。

输入格式
第一行两个整数 n,m。

接下来 m行，每行有两个整数，代表一条边。

输出格式
输出一个数表示答案。

样例输入
5 4
1 3
2 3
3 4
3 5
样例输出
3
数据规模
对于所有数据，保证 2≤n≤1000,0≤m≤10000,1≤x,y≤n,x≠y
。
*/

vector<int> edge[1001];
int n, m, v[1001], r[1001]; 
bool b[1001];

bool find(int x) {
	b[x] = true;
	for(auto y:edge[x])
		if (!v[y] || (!b[v[y]] && find(v[y]))) {
			v[y] = x;
			return true;
		}
	return false;
}

int match() {
	int ans = 0;
	memset(v, 0, sizeof v);
	for (int i = 1; i <= n; i++) {
		memset(b, false, sizeof b);
		if (find(i))
			++ans;
	}
	return ans;
}


int main()
{
	scanf("%d%d",&n,&m);
	for (int i = 1; i <= m; i++) {
		int x, y;
		scanf("%d%d", &x, &y);
		edge[x].push_back(y);
	}
	printf("%d\n",n-match());


	return 0;
}
 